package task

import (
	"github.com/gogf/gf/v2/container/garray"
	"github.com/gogf/gf/v2/net/ghttp"
	"github.com/gogf/gf/v2/text/gstr"

	"github.com/beherochuling/beesoft_api/app/helper/net"

	model "github.com/beherochuling/beesoft_api/app/model/task"
	service "github.com/beherochuling/beesoft_api/app/service/task/task"
)

var Task = &taskApi{
	// Text: &textApi{ // 文本
	// 	Generation:  &textGenerationApi{},  // 生成
	// 	Translation: &textTranslationApi{}, // 翻译
	// 	Security:    &textSecurityApi{},    // 安全
	// 	Crypto:      &textCryptoApi{},      // 加密
	// },
	// Document: &documentApi{
	// 	Conversion:  documentConversionApi{},  // 转换
	// 	Translation: documentTranslationApi{}, // 翻译
	// }, // 文档
	// Image: &imageApi{
	// 	BackgroundRemove: imageBackgroundRemoveApi{}, // 背景去除
	// 	WatermarkRemove:  imageWatermarkRemoveApi{},  // 水印去除
	// }, // 图片
	// Visual: &visualApi{
	// 	BackgroundRemove: visualBackgroundRemoveApi{}, // 背景去除
	// 	WatermarkRemove:  visualWatermarkRemoveApi{},  // 水印去除
	// }, // 视频
	// Audio: &audioApi{ // 音频
	// 	Conversion:  &audioConversionApi{},  // 转换
	// 	Translation: &audioTranslationApi{}, // 翻译
	// 	Tts:         &audioTtsApi{},         // TTS
	// 	Asr:         &audioAsrApi{},         // ASR
	// }, // 音频
	// Video: &videoApi{
	// 	Conversion:  &videoConversionApi{},  // 转换
	// 	Translation: &videoTranslationApi{}, // 翻译
	// }, // 音视频
	// Other: &otherApi{ // 其它
	// 	Archive: &otherArchiveApi{}, // 打包
	// },
}

type taskApi struct {
	// Text     *textApi     // 文本
	// Document *documentApi // 文档
	// Image    *imageApi    // 图片
	// Visual   *visualApi   // 视频
	// Audio    *audioApi    // 音频
	// Video    *videoApi    // 音视频
	// Other    *otherApi    // 其它
}

// 类型获取
func getServiceType(r *ghttp.Request) string {
	serviceGroup := gstr.ToLower(r.Get("service_group", "").String())
	serviceType := gstr.ToLower(r.Get("service_type", "").String())
	serviceType = serviceGroup + "/" + serviceType

	taskTypes := garray.NewStrArrayFrom(TaskType.GetTypes())
	if serviceType == "" || !taskTypes.Contains(serviceType) { // 校验
		net.NewResponse(r).ResponseServerError("invalid task type")
	}

	return serviceType
}
func getTaskId(r *ghttp.Request) string {
	taskId := gstr.ToLower(r.Get("id", "").String())

	if taskId == "" || len(taskId) != 36 { // 校验
		net.NewResponse(r).ResponseServerError("invalid task id")
	}

	return taskId
}

// 通用控制器方法

func (receiver *taskApi) Store(r *ghttp.Request) { // 创建任务
	ctx := r.Context()
	serviceType := getServiceType(r)
	input := r.GetBodyString()
	var createdBy uint = 1
	// helper.Info("input", input)

	task, err := service.Task.Create(ctx, serviceType, createdBy)
	if err != nil {
		net.NewResponse(r).ResponseServerError(err.Error())
	}

	_, err = service.Task.CreateExtend(ctx, &model.TaskExtends{ // task_extend
		TaskId: task.Id,
		Input:  input,
	})
	if err != nil {
		net.NewResponse(r).ResponseServerError(err.Error())
	}

	err = service.Task.Push(ctx, task)
	if err != nil {
		panic(err)
	}

	net.NewResponse(r).ResponseOkWithTaskId(task.Uuid)
}
func (receiver *taskApi) Show(r *ghttp.Request) { // 查询任务
	id := getTaskId(r)

	task, err := service.Task.GetByUUID(r.Context(), id)
	if err != nil {
		net.NewResponse(r).ResponseServerError(err.Error())
	}

	net.NewResponse(r).ResponseOk(task)
}
